//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//
//public class Main {
//    public static void main(String[] args) {
//       ExecutorService service = Executors.newCachedThreadPool();
//       //创建好之后会得到一个ExecutorService对象
//        for(int i = 0; i <1000; i++) {
//            int id = i;
//            service.submit(new Runnable() { //向线程池内添加任务
//                @Override
//                public void run() {
//                    System.out.println("hello  " +id+"  "+ Thread.currentThread().getName());
//                    // 顺便打印该线程的名字
//                }
//            });
//        }
//    }
//}
//
//
////------------------------------------------------------------------------------------创建实现一个线程池
//import java.util.concurrent.ArrayBlockingQueue;
//import java.util.concurrent.BlockingQueue;
//
//class MyThreadPool{
//    //创建队列，存放任务
//    private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);
//
//    //初始化线程池
//    public MyThreadPool(int n){ //创建时指定线程池的数目
//        for (int i = 0; i < n; i++){
//            Thread t = new Thread(()->{
//                try{
//                    while (true){
//                        Runnable runnable = queue.take();
//                        runnable.run();
//                    }
//                }catch (InterruptedException e){
//                    e.printStackTrace();
//                }
//            });
//            t.start();
//        }
//
//    }
//
//    //把任务添加斗到线程池中
//    void submit(Runnable runnable) throws InterruptedException{
//        queue.put(runnable);
//    }
//}
//
//public class Main {
//    public static void main(String[] args) throws InterruptedException {
//
//        MyThreadPool threadPool = new MyThreadPool(10);
//
//        for(int i = 0; i<1000; i++){
//            int id = i;
//
//            threadPool.submit(new Runnable() {
//                @Override
//                public void run() {
//                    System.out.println("hello  "+ id +"  "+Thread.currentThread().getName());
//                }
//            });
//        }
//    }
//}
//


//-------------------------------------------------------------------------------------------使用定时器
//
//import java.util.Timer;
//import java.util.TimerTask;
//
//public class Main {
//    public static void main(String[] args) {
//        Timer timer = new Timer();
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                System.out.println("333");
//            }
//        },3000);
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                System.out.println("222");
//            }
//        },2000);
//        timer.schedule(new TimerTask() {
//            @Override
//            public void run() {
//                System.out.println("111");
//            }
//        },1000);
//    }
//}
//
//----------------------------------------------------------------------------------------自己床架定时器
//
//import java.util.ArrayList;
//import java.util.Comparator;
//import java.util.List;
//import java.util.PriorityQueue;
//
//class MyTimerTask implements Comparable<MyTimerTask> {
//    private Runnable runnable;
//
//    private long time;
//    //啥时候去执行，此处的time不是delay，而是ms级别的之间戳，（绝对时间）
//
//    public MyTimerTask(Runnable runnable,long delay){
//        this.runnable = runnable;
//        this.time = System.currentTimeMillis()+delay;
//        //手动你好换算一下时间
//    }
//
//    public void run(){   //执行run
//        runnable.run();
//    }
//
//    public long getTime() { //获取执行任务时的时间
//        return time;
//    }
//
//    @Override
//    public int compareTo(MyTimerTask o) {        //比较优先级，按时间来比，看谁先执行
////        return (int)(o.time - this.time);
//        return (int) (this.time - o.time);
//    }
//}
////
////class MyTimer{
////    private List<MyTimerTask> taskList = new ArrayList<>();
////    //用数组来保存
////
////    public void schedule(Runnable runnable, long delay){
////        MyTimerTask task = new MyTimerTask(runnable, delay);
////        taskList.add(task);
////
////    }
////}
//
//class MyTimer{
//    private Object locker = new Object();
//    private PriorityQueue<MyTimerTask> taskQueue = new PriorityQueue<>();
//    //使用优先级队列来保存，效果更好
//
//    public MyTimer() {
//        Thread t = new Thread(() -> {
//            try {
//                while (true) {
//                    synchronized (locker) {
//                        if (taskQueue.size() == 0) {
//                            locker.wait();
//                        }
//                        MyTimerTask task = taskQueue.peek();
//                        long curTime = System.currentTimeMillis();
//                        //获取当前时间
//                        if (curTime >= task.getTime()) {
//                            task.run();
//                            taskQueue.poll();
//                        } else {
//                            locker.wait(task.getTime() - curTime);
//                            //等待一段时间
//                        }
//                    }
//                }
//            }catch (InterruptedException e){
//                e.printStackTrace();
//            }
//        });
//        t.start();
//    }
//
//    public void schedule(Runnable runnable, long delay){
//        synchronized (locker) {
//            MyTimerTask task = new MyTimerTask(runnable, delay);
//            taskQueue.offer(task);
//            locker.notify();//唤醒上面wait
//        }
//    }
//}
//
//public class Main {
//    public static void main(String[] args){
//        MyTimer myTimer = new MyTimer();
//        myTimer.schedule(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("hello 333");
//            }
//        },3000);
//        myTimer.schedule(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("hello 222");
//            }
//        },2000);
//        myTimer.schedule(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("hello 111");
//            }
//        },1000);
//    }
//}
//
//----------------------------------------------------------------------------------------- CAS原子类


import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    private static AtomicInteger count = new AtomicInteger(0);
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(()->{
           for(int i = 0; i < 50000; i++ ) {
               count.getAndIncrement();
               // count++
               count.incrementAndGet();
               // ++count;
               count.getAndDecrement();
               // count--
               count.decrementAndGet();
               // --count
               count.getAndAdd(10);
               // count += 10
           }
        });
        Thread t2 = new Thread(()->{
            for(int i =0; i < 50000; i++){
                count.getAndIncrement();
                // count++
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("count = "+count);

    }
}
